<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>function</title>
</head>
<body>
	<!-- 函数相关 -->
	<script>
		function myFn(){
			// ==声明函数==
			// 强制性函数关键字
			// 强制性函数名称
			// 强制性左括号
			// 可选逗号隔开的参数列表
			// 强制右括号
			// 强制左大括号
			// 可选函数体
			// 强制右大括号
		}
		function sa(){
			return 'sa here'
		}
		function ninja(){
			function hiddenNinja(){
				return 'hide ninja'

			}
			return hiddenNinja();
		}
		//js中通用的使用方式
		console.log(-function (){return 8}());
		console.log(~function (){return 8}());
		console.log(+function (){return 8}());
		console.log(!function (){return 8}());
		(function a(){console.log('fntest')})();

		// 箭头函数
		// 0 1+ ()必需
		// 逗号分隔参数列表
		// 必选=>
		// 函数体如果是表达式，函数体的返回值是为表达式的值
		// 函数体是一个代码块 返回值和普通函数一样
		
		/////////////////////////
		// 使用箭头函数规避标准函数难以捉摸的缺陷 //to-learn
		/////////////////////////

		param=>expression
		var greet = name=>'ni hao :'+name;
		console.log(greet('nl'));

		// es6 剩余参数 rest parameter must be last formal parameter
		function multiMax(first,...rest){
			return first*rest.sort((a,b)=>{return b-a;})[0]
		}
		console.log('默认参数实例输出：'+  multiMax(2,1,4,3,5,9,3,22));

		//es6 默认参数
		//其他编程语言中重载 java 相同函数名 不同参数
		//es6 之前做判断实现类似的效果
		function before(ninja,action){
			action = typeof action === 'undefined'?'sku':action;
			return ninja+''+action;
		} 
		console.log(before('nl','latmy'));
		// es6中使用默认参数
		function now(ninja='nieliang',action='niupi'){
			return ninja+action+'666';
		}
		console.log(now());
		console.log(now('zhengdeniupi'));
		//默认参数还可一引用前面的参数
		
		function test(a,b,...c){
			/*a,b,c*/
		}
		test(1,2,3,4,5);
		test();



	</script>
</body>
</html>






